import qs from 'query-string'

/**
 * 将路由信息转换为字符串表示。
 *
 * @param {Object} options - 路由选项对象。
 * @param {string} [options.path] - 路径。
 * @param {Object} [options.query] - 查询参数。
 * @param {boolean} [options.hashed] - 是否使用哈希值。
 * @param {boolean} [options.fulled] - 是否使用完整 URL。
 * @returns {string} - 转换后的路由字符串。
 */
export function stringifyRoute({
  path = '',
  query = {},
  hashed = true,
  fulled = false,
} = {}) {
  let value = path

  if (fulled) {
    value = `${location.origin}${location.pathname}${hashed ? '#' : ''}${path}`
  }

  if (query && Object.keys(query).length) {
    value += `?${qs.stringify(query)}`
  }

  return value
}

/**
 * 解析路由字符串，将其拆分为路径和查询参数。
 * @param {string} route - 路由字符串，包含路径和可选的查询参数。
 * @param {object} options - 解析选项。
 * @param {object} options.addQuery - 要添加到查询参数的附加参数。
 * @returns {object} - 包含路径和解析后的查询参数的对象。
 */
export function parseRoute(route = '', { addQuery = {} } = {}) {
  const [path = '', query = {}] = route.split('?')

  const value = {
    path,
    query: {
      ...qs.parse(query),
      ...addQuery,
    },
  }

  return value
}

/**
 * 格式化路由对象或路由字符串，将其路径和查询参数合并，并可选地添加附加参数。
 * @param {object|string} route - 路由对象或路由字符串。如果是路由字符串，将使用parseRoute函数解析为路由对象。
 * @param {object} options - 格式化选项。
 * @param {object} options.addQuery - 要添加到查询参数的附加参数。
 * @returns {object} - 包含格式化后的路径和查询参数的对象。
 */
export function routeFormatter(route = {}, { addQuery = {} } = {}) {
  const { path, query } = typeof route === 'string' ? parseRoute(route) : route

  const value = {
    path,
    query: {
      ...query,
      ...addQuery,
    },
  }

  return value
}
